﻿//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//#include <windows.h>
//#include <stdlib.h>
//#include <string.h>

#include "common.h"

void date_output()
{ // 输入 xxxx年xx月xx日，分三行输出年月日
	int year = 0000;
	int month = 00;
	int date = 00;
	int rs = scanf("%4d年%02d月%02d日", &year, &month, &date);
	// 注意输入要求必须要写年月日
	int prf = printf("%4d年\n%02d月\n%02d日\n", year, month, date);
	printf("%d\n", prf); // 17 printf 函数会返回打印字符的大小（%nd 占4个字节）
}

void grade_output()
{ // 按照格式输入学号，三科成绩，并输出
	int id = 0;
	float c = 0.0f;  // 默认是 double 类型，f 后缀可强制转化为 float 类型
	float math = 0.0f;
	float english = 0.0f;
	int ss = scanf("%d;%f,%f,%f", &id, &c, &math, &english);
	if (c >= 0 && math >= 0 && english >= 0)
		if (c <= 100 && math <= 100 && english <= 100)
			printf(
				"The each subject score of No. %d is %.2f, %.2f, %.2f.\n",
				id, c, math, english);
		else
			printf("成绩必须小于等于100\n");
	else
		printf("成绩或学号输入错误\n");
}

void max_four(int num)
{
	int arr_in[1000] = { 0 };
	/*int ro = scanf("%zd %zd %zd %zd",
				   &arr_in[0], &arr_in[1], &arr_in[2], &arr_in[3]);*/
	int c = 0;
	while (c < num)
	{
		int roc = scanf("%d", &arr_in[c]);
		c++;
	}
	int max = arr_in[0];
	int i = 0;
	while (i < sizeof(arr_in) / sizeof(arr_in[0]))
	{
		if (max < arr_in[i])
			max = arr_in[i];
		i++;
	}
	printf("%d", max);
}

int n_factorial(int n)
{ // 计算 n 的阶乘
	int cs;
	int res = 1;
	int sum_res = 0;
	for (cs = 1; cs <= n; cs++)
	{
		res *= cs;
		//printf("%d 的阶乘为：%d\n", cs, res);
		sum_res += res;
		//printf("%d的阶乘累加和为：%d\n", cs, sum_res);
	}
	//printf("阶乘累加和为：%d\n", sum_res);
	return res;
}

void printf_merge()
{
	// 测试语句：我是萝莉控
	char arr_str1[] =
		"I am just like the person is just a infantile girl!";
	int right = 0; //初始化
	// 注意字符串结束标识为 '\0' sizeof是算进去的（注意一个中文占两字节）
	int left = 0;
	char arr_str2[] =
		"***************************************************";
	/*int len = strlen(arr_str2) - 1;  // 字符串长度计算
	printf("%d %d", right, len);*/
	for (left = 0, right = sizeof(arr_str1) / sizeof(arr_str1[1]) - 2;
		left <= right; left++, right--)
	{
		arr_str2[left] = arr_str1[left];
		arr_str2[right] = arr_str1[right];
		printf("%s\n", arr_str2);
		//printf("\n");  // 单独打印换行必须是双引号
		Sleep(50);  // 头文件为 windows.h
		// 清空屏幕
		//system("cls");  // 头文件为 stdlib.h
		// system 用于执行系统命令，cls 可以清理屏幕（在cmd中可以测试）
	}
	//printf("%s\n", arr_str2);
}

int log_in(char mima[], int n)
{
	int i;
	for (i = 0; i < n; i++)
	{
		char qrm[60] = { 0 };
		printf("请输入密码(秘密长度小于60)：");
		int rs = scanf("%s", qrm);
		if (0 == strcmp(mima, qrm))  // 如果返回零表示两个字符串相等
			// strcmp 的头文件为 string.h
		{ // 比较两个字符串是否相等，不应该使用 == 而要使用库函数 strcmp
			printf("输入密码正确\n");
			break;
		}
		else
			printf("输入秘密错误，请重新输入：\n");
	}
	if (i == n)
	{
		printf("输入错误密码超过%d次，退出登录\n", n);
		return 0;
	}
	else
		return 1;
}

void bubble_sort(int arr[], int n) // 冒泡排序，时间复杂度 O(n^2)
{ // 输入数组，与排序数组的长度，打印排序（从大到小）后的数组
	int i, j, temp;
	int swapped; // 用于标记是否进行了交换

	for (i = 0; i < n - 1; ++i)
	{
		swapped = 0; // 每次循环开始前重置标记
		for (j = 0; j < n - i - 1; ++j)
		{
			if (arr[j] < arr[j + 1])
			{ // 交换 arr[j] 和 arr[j + 1]
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				swapped = 1; // 发生了交换
			}
		}
		if (swapped == 0) // 如果没有交换，说明数组已经有序，提前结束
			break;
	}
	for (i = 0; i < n; ++i) // 输出排序后的数组
		printf("%d ", arr[i]);
	printf("\n");
}

int common_divisor(unsigned int a, unsigned int b)
{ // 计算两个数的最大公约数
	int temp; // 用于交换 a 和 b 的值
	/*if (a < b) // 循环计算最大公约数（硬算，直到 temp 为 0）
	{ // 保证 a >= b，且
		temp = b;
		b = a;
		a = temp;
	}
	else // 保证 temp 始终指向较小的数
		temp = a;
	while (1)
	{
		if (a % temp == 0 && b % temp == 0)
			return temp; // 找到最大公约数，返回
		else
			temp--; // 尝试更小的数作为公约数
	}*/

	/*while (b != 0) // 使用辗转向除法（可以不考虑 a 和 b 的大小关系）
	{ // 循环计算最大公约数（模运算，直到 b 为 0）
		temp = b;
		b = a % b;
		a = temp;
	}
	return a;*/
	while (temp = a % b) // 同上，优化版本
	{
		a = b;
		b = temp;
	}
	return b;
}

int count_9(int start, int end, int num)
{ // 计算 start 到 end 个整数之间有多少个 num
	int count = 0;
	int i, j;
	for (i = start; i <= end; ++i)
	{
		j = i; // 复制 i 到 j
		while (j >= 10)
		{
			if (j % 10 == num)
				++count;
			j /= 10; // 去掉最后一位数字
		}
		if (j % 10 == num)
			++count;
	}
	return count;
}

float sum_n_to_one(int n)
{
	float sum = 0.0f;
	int i = 1;
	//while (i <= n)
	//{
	//	if (i % 2 == 0) // 偶数
	//		sum -= 1.0f / i; // 1/2 + 1/4 + 1/6 + ... + 1/2n
	//	else // 奇数
	//		sum += 1.0f / i; // 1/1 + 1/2 + 1/3 + ... + 1/n
	//	++i;
	//}
	// 非常规思维
	int flag = 1; // 标记是否计算完成
	for (i = 1; i <= n; ++i)
	{
		sum += flag * 1.0f / i; // 1/1 - 1/2 + 1/3 - ... (+/-) 1/n
		flag = -flag; // 标记符号翻转
	}
	return sum;
}
